import { WebSocketServer, WebSocket } from 'ws';
import { v4 as uuidv4 } from 'uuid';
import { pool } from './db-pg.js';

// 创建WebSocket服务器 (端口8080)
const wss = new WebSocketServer({ port: 8080 });

// // 创建数据库配置
// const dbConfig={
//   host:'localhost',
//   user:'root',
//   password:'123456',
//   database:'chat_app'
// }
// // 初始化数据库
// const pool=mysql.createPool(dbConfig);


//存储所有连接的客户端
const clients = new Set();
// 定义一个用户账号存储
// const users = new Map();

// 事件追踪，当新客户端通过WebSocket连接时触发connection事件
wss.on('connection', (ws) => {

  // 定义一个初始化连接状态
  var connectionData = {
    verified: false , //用于判断是否登录成功
    conname:null //用于存储登录的用户名
  };
  // 新连接的客户端加入Set集合进行统一管理
  clients.add(ws);

  console.log(`新客户端连接，当前连接数:${clients.size}`);

  // 收到客户端消息时触发
  ws.on('message', async (message) => {
    console.log('收到消息 →', message.toString());
    const data = message.toString();

    console.log(connectionData.verified);


    // 判断是否是登录状态
    // 如果是登录状态，使用广播向客户端发送信息
    if (connectionData.verified) {
      //遍历所有已连接的客户端：使用广播将信息给所有连接的客户端
      wss.clients.forEach(client => {
        // 检查客户端连接状态
        // WebSocketServer.OPEN（这是服务器类）而不是WebSocket.OPEN（客户端连接状态常量）
        if (client !== ws && client.readyState === WebSocket.OPEN) {
          if(data.includes('system')){
            client.send(data);
          }
          else{
            const mess=`${connectionData.conname}:${data}`;
            console.log(mess);
            client.send(mess);
          }
        }
      })
    }
    
    // 不是登录状态
    else{
      // console.log(users);      
      // 将数据分割成，用户名，用户id，用户登录\注册状态
      const username=data.split(',')[0];
      var userid=data.split(',')[1];
      const regOrlog=data.split(',')[2];
      console.log(username);
      console.log(userid);
      console.log(regOrlog);
      
      // 判断是否存在用户名，如果存在
      // 通过客户端传来的信息判断是否要注册、登录
    if (regOrlog == 'regist'||regOrlog=='login') {

      // 如果要注册
      if(regOrlog == 'regist'){
        // 将用户名和随机生成的id保存到users中
        const userid = GetId();
        // 将数据保存
        // users.set(username, { type: 'init', userid, username });
        // 数据保存后，使用json将用户id发送给客户端
        const usermsg = JSON.stringify({ type: 'init', userid, username });
        await pool.query(
          'INSERT INTO users (username, userid) VALUES ($1, $2)',
          [username, userid] // ✅ 正确：自动加引号
        );
        ws.send(usermsg)
      }
      // 登录
      else{
        console.log('进入登录');
        
        // 数据库查询是否有该用户
        const {rows} = await pool.query(
          'SELECT * FROM users WHERE username = $1 AND userid = $2',
          [username, userid]
        );
        console.log(rows.length);
        
        // 如果有
        if(rows.length>0){
          connectionData.verified = true;
          connectionData.conname = username;
          console.log(connectionData.verified);
          // 登录成功后向客户端发送信息，提示登录成功
          ws.send(JSON.stringify({states:'成功',username,userid}))
        }
        // 判断用户输入的id和存储的id是否相等，如果正确，可发送信息
        // if (userid == users.get(username).userid) {
        //   // console.log(users);
        //   connectionData.verified = true;
        //   connectionData.conname = username;

        //   // 登录成功后向客户端发送信息，提示登录成功
        //   ws.send(JSON.stringify({states:'成功'}))

        // }

        // 不正确还需再次输入
        else {

        }
      }
      
    }


    // 回复客户端（添加随机表情演示双向通信）
    // const emojis = ['🚀', '🌟', '💡', '🎯'];
    // const randomEmoji = emojis[Math.floor(Math.random() * emojis.length)];
    // ws.send(`++++++++服务器已收到：${message} ${randomEmoji}`);

  }
  });
  // 连接关闭时触发
  ws.on('close', () => 
    {
      // clients.delete(ws); // ✅ 必须删除
      console.log(`客户端断开，当前连接数：${clients.size}`)
    }
  );
});

console.log('✅ WebSocket服务器运行中：ws://localhost:8080');

function GetId() {
  var id = Math.floor(1000 + Math.random() * 9000);
  return id;
}
